home *** CD-ROM | disk | FTP | other *** search
- TITLE RM - MSDOS FILE DELETE UTILITY
- PAGE 55,132
- ;**********************************************************************
- ; THIS PROGRAM DELETES ONE OR MORE FILES, OR (WITH THE /R SWITCH)
- ; THE CONTENTS OF A WHOLE DIRECTORY.
- ;
- ; USAGE (afn = ambiguous file name):
- ;
- ; RM afn1 afn2 ... - deletes the named file(s)
- ;
- ; SWITCHES (OPTIONAL):
- ;
- ; RM/F - remove write-protected files without warning
- ;
- ; RM/I - query before each deletion
- ;
- ; RM/R - allows deleting directories (recursively).
- ; (this is DANGEROUS, especially without the /I switch)
- ;
- ; RM/V - "verbose" mode, shows name of each file deleted.
- ;
- ; TO BUILD RM.EXE:
- ; MASM RM,RM,NUL,NUL
- ; LINK RM,RM,NUL,ASM -C800
- ;
- ; BY: JON DART
- ; DEPARTMENT OF ANTHROPOLOGY
- ; UCSD C-001
- ; LA JOLLA, CA 92093
- ;
- ; VERSION 1.3, 19-JUL-86 (FIXES GROSS BUGS IN WILDCARD HANDLING)
- ; VERSION 1.2, 06-JUL-86 (CHANGES TO MEMORY ALLOC., ACCEPTS HYPHEN
- ; AS SWITCH CHAR., ASSEMBLES UNDER MASM 4.0)
- ; VERSION 1.1, 03-JUL-86 (BUG FIXES)
- ; VERSION 1.0, 30-JUN-86
- ;
- PATHSIZE EQU 65 ;MAX. SIZE OF DOS PATHNAME, +1
- MAXLEVEL EQU 12 ;MAX NESTING LEVEL FOR DIRECTORIES
- MAXARGS EQU 40 ;MAXIMUM # OF COMMAND LINE ARGUMENTS
- PRGSIZE EQU 1800H ;MAX. SIZE OF CODE AND FIXED DATA
- TRUE EQU 1
- FALSE EQU 0
- CONFIRM EQU FALSE ;"CONFIRM BEFORE DELETE" DEFAULT
- VERBOSE EQU FALSE ;"VERBOSE" OPTION (DEFAULT VALUE)
- GOOFPROOF EQU TRUE ;CONFIRM BEFORE DELETING *.*
- BIT$DIR EQU 00010000B ;BIT IN ATTRIBUTE FOR DIRECTORY
- BIT$RO EQU 00000001B ;BIT IN ATTRIBUTE FOR WRITE-PROTECT
-
- .XLIST
- INCLUDE ASCII.DEF
- INCLUDE MSDOS2.DEF
- INCLUDE MACROS.DEF
- .LIST
-
- RMINFO STRUC
- NEWDIR DW 1 DUP (?) ;FLAG, =1 IF NEW DIRECTORY CREATED
- PATHTYPE DB 2 DUP (?) ;TYPE OF SOURCE (0 IF UFN)
- ARG DB PATHSIZE DUP (?) ;FIRST ARGUMENT (SOURCE)
- SPATH DB PATHSIZE DUP (?) ;SOURCE SEARCH PATH
- SPREFIX DB PATHSIZE DUP (?) ;SOURCE LEAD-IN PATH
- SCRATCH DB PATHSIZE DUP (?) ;SCRATCH AREA
- FULLNAME DB PATHSIZE DUP (?) ;UNAMBIGUOUS SOURCE NAME
- DTA DB 128 DUP (?) ;DTA FOR SEARCH FN.
- RMINFO ENDS
- RMSTRUCSIZE EQU 5*PATHSIZE+135 ;SIZE OF STRUCTURE
-
- DATA SEGMENT WORD PUBLIC
- ;
- ; FIXED DATA AREA:
- ;
- MSG1 DB 'RM Version 1.3 by Jon Dart (19-Jul-86)',CR,LF,CR,LF
- DB 'USAGE:',CR,LF,CR,LF
- DB 'RM [-F -I -R -V] file1 file2 ... deletes the named file(s)',CR,LF,CR,LF
- DB 'SWITCHES (OPTIONAL):',CR,LF,CR,LF
- DB '-F remove write-protected files without warning',CR,LF
- DB CR,LF
- DB '-I query before delete',CR,LF
- DB CR,LF
- DB '-R allow recursive deletion of directories',CR,LF
- DB CR,LF
- DB '-V echo file names as they are deleted',CR,LF
- DB 0
- MSG2 DB ': file not found.',CR,LF,0
- MSG3 DB ': directory.',CR,LF,0
- MSG4 DB ' : OK to delete [Y or N]? ',0
- MSG5 DB ": can't remove.",CR,LF,0
- MSG6 DB ': file is R/O. ',0
- MSG6A DB 'Are you SURE [Y or N]? ',0
- MSG7 DB "Directories nested too deep.",CR,LF,0
- MSG8 DB "Insufficient memory for buffers.",CR,LF,0
- MSG9 DB ": Illegal switch.",CR,LF,0
- MSG10 DB "Too many arguments.",CR,LF,0
- MSG11 DB ' directory. Enter it [Y or N]? ',0
- MSG12 DB ' directory. Delete it [Y or N]? ',0
- MSG13 DB '? ',0
- WILD DB '*.*',0
- DATA ENDS
-
- STACK SEGMENT PARA STACK
- DB 512 DUP (?)
- STACK ENDS
-
- ; VARIABLES AND BUFFER AREAS, STORED IN FREE MEMORY ABOVE PROGRAM,
- ; RELATIVE TO "BASE" (DS AND ES WILL NORMALLY POINT TO START OF THIS AREA):
-
- RBASE EQU 2 ;POINTER TO RMSTRUC IN RSTACK
- LEVEL EQU 4 ;RECURSION LEVEL
- DRIVE EQU 6 ;SOURCE DRIVE (0 = DEFAULT)
- IFLAG EQU 8 ;CONFIRM FLAG
- FFLAG EQU 10 ;FORCE FLAG
- RFLAG EQU 12 ;RECUSIVE FLAG
- VFLAG EQU 14 ;VERBOSE FLAG
- CMDTAIL EQU 16 ;STORAGE FOR COMMAND TAIL
- NUMARGS EQU CMDTAIL+512 ;NUMBER OF ARGUMENTS ON COMMAND LINE
- ARGPTRS EQU NUMARGS+2 ;POINTERS TO START OF ARGUMENTS
- RSTACK EQU ARGPTRS+(2*MAXARGS) ;RECURSION STACK
- DATASIZE EQU (RSTACK)+(MAXLEVEL*RMSTRUCSIZE)+256
-
- PAGE +
- CODE SEGMENT BYTE PUBLIC
- ASSUME CS:CODE,DS:DATA ,ES:DATA ,SS:STACK
- EXTRN CPYCNT:NEAR,UC:NEAR,UCSTR:NEAR,CRLF:NEAR
- EXTRN ERRORMSG:NEAR,COUT:NEAR,CIN:NEAR,CLRCO:NEAR
- EXTRN SKIPSP:NEAR,TYPTX:NEAR,ERRORMSG:NEAR,CLRCO:NEAR
- EXTRN FIXPATH:NEAR,TYPE_DIR:ABS,TYPE_AFN:ABS
- EXTRN TYPE_UFN:ABS,TYPE_DSP:ABS,TYPE_DRV:ABS,TYPE_UNK:ABS
- EXTRN GETYORN:NEAR
-
- ;*********************
- ;* MACRO DEFINITIONS *
- ;*********************
-
- ADDR MACRO REG,OFFST ;COMPUTE ADDRESS OFFSET FROM BASE REGISTER (BX)
- MOV REG,BX
- ADD REG,OFFSET OFFST
- ENDM
-
- ERROR MACRO ERRNUM ;SHOW ERROR MESSAGE
- PUSH DS
- MOV AX,DATA
- MOV DS,AX
- MOV DX,OFFSET DATA :MSG&ERRNUM
- CALL ERRORMSG
- POP DS
- ENDM
-
- ;**********************
- ; PROGRAM ENTRY POINT *
- ;**********************
- ENTRY:
- TEST_DOS2 ;TEST FOR DOS 2.0, EXIT IF DOS 1
- MOV BX,(DATASIZE+PRGSIZE) SHR 4
- MOV AH,SET_BLOCK
- INT DOS ;SET PROGRAM+BUFFER SIZE
- JNB MEMOK ;IF OK
- MOV AX,DATA
- MOV DS,AX
- MOV DX,OFFSET MSG3
- CALL ERRORMSG ;NOT ENOUGH MEMORY
- JMP EXIT2
- MEMOK: MOV AX,DS ;GET DATA SEG
- ADD AX,PRGSIZE ;ADD OFFSET TO BUFFER
- MOV ES,AX ;SET EXTRA SEG TO POINT TO BUFFER
- MOV BX,OFFSET (80H) ;GET BYTE COUNT FOR COMMAND LINE
- CMP [BX],BYTE PTR 0
- JE USEMSG ;IF NO COMMAND TAIL
- PUSH BX
- MOV DL,[BX]
- MOV DH,0
- ADD BX,DX
- INC BX
- MOV [BX],BYTE PTR 0 ;PUT 0 BYTE AT END OF COMMAND LINE
- POP BX
- INC BX
- CALL SKIPSP ;SKIP LEADING SPACES
- JNC L_2 ;IF SOMETHING ON LINE
- USEMSG: ERROR 1
- JMP EXIT2
- L_2:
- MOV SI,BX
- MOV DI,OFFSET CMDTAIL
- MOV CX,128
- CALL CPYCNT ;SAVE COMMAND TAIL
- MOV AX,ES
- MOV DS,AX ;SET DATA SEG TO VARIABLE AREA
- MOV BYTE PTR DS:IFLAG,CONFIRM ;SET CONFIRM FLAG DEFAULT
- MOV BYTE PTR DS:VFLAG,VERBOSE ;SET VERBOSE FLAG DEFAULT
- MOV BYTE PTR DS:RFLAG,FALSE ;SET RECURSIVE FLAG DEFAULT
- MOV BYTE PTR DS:FFLAG,FALSE ;SET FORCE FLAG DEFAULT
- MOV WORD PTR DS:LEVEL,0 ;ZERO RECURSION LEVEL
- MOV BYTE PTR DS:DRIVE,0 ;SET DRIVE DEFAULT
- ;***************************
- ; COLLECT SWITCHES, IF ANY *
- ;***************************
- MOV BX,OFFSET CMDTAIL ;POINT TO COMMAND TAIL
- CALL UCSTR ;MAKE UPPER-CASE
- NEXTSW:
- CALL SKIPSP
- JB USEMSG ;IF NOTHING ON LINE BESIDES SWITCHES
- CMP BYTE PTR [BX],'/' ;SWITCH SPECIFIED?
- JE GOTSW ;YES
- CMP BYTE PTR [BX],'-' ;CHECK HYPHEN, TOO
- JNE NOSWITCH ;NOPE
- GOTSW:
- INC BX ;SKIP OVER SWITCH CHAR.
- CALL SKIPSP ;SKIP LEADING BLANKS
- JB USEMSG ;IF NOTHING
- CALL UC ;MAKE SWITCH UPPER CASE
- CMP AL,'F' ;FORCE SWITCH?
- JE FSWITCH
- CMP AL,'I' ;QUERY SWITCH?
- JE ISWITCH
- CMP AL,'R' ;RECURSIVE SWITCH?
- JE RSWITCH
- CMP AL,'V' ;VERBOSE SWITCH?
- JE VSWITCH
- CALL COUT ;DISPLAY BAD CHAR.
- ERROR 9 ;ILLEGAL SWITCH
- JMP EXIT2
- FSWITCH:
- MOV AL,1
- SUB AL,BYTE PTR DS:FFLAG
- MOV BYTE PTR DS:FFLAG,AL ;TOGGLE FFLAG
- INC BX ;SKIP SWITCH LETTER
- JMP NEXTSW
- ISWITCH:
- MOV AL,1
- SUB AL,BYTE PTR DS:IFLAG
- MOV BYTE PTR DS:IFLAG,AL ;TOGGLE IFLAG
- INC BX ;SKIP SWITCH LETTER
- JMP NEXTSW
- RSWITCH:
- MOV AL,1
- SUB AL,BYTE PTR DS:RFLAG
- MOV BYTE PTR DS:RFLAG,AL ;TOGGLE RFLAG
- INC BX ;SKIP SWITCH LETTER
- JMP NEXTSW
- VSWITCH:
- MOV AL,1
- SUB AL,BYTE PTR DS:VFLAG
- MOV BYTE PTR DS:VFLAG,AL ;TOGGLE VFLAG
- INC BX ;SKIP SWITCH LETTER
- JMP NEXTSW
- ;************************************************************
- ; SCAN THE COMMAND LINE AND STORE POINTERS TO ALL ARGUMENTS *
- ;************************************************************
- NOSWITCH:
- MOV CX,0 ;CX COUNTS # OF ARGUMENTS
- MOV SI,OFFSET DS:ARGPTRS ;POINT TO ARG POINTER TABLE
- SAVEARG:
- INC CX ;BUMP ARGUMENT COUNT
- CMP CX,MAXARGS
- JG TOOMANY ;IF TOO MANY
- MOV DS:[SI],BX ;SAVE POINTER TO ARG
- ADD SI,2 ;ADVANCE TO NEXT TABLE ENTRY
- CNTARGS:
- MOV AL,DS:[BX] ;GET CHAR. FROM COMMAND LINE
- CMP AL,0
- JE ENDLINE ;IF END OF LINE
- COMPLIST <SPACE,TAB>,NEXTARG ;SEE IF SPACE OR TAB
- INC BX
- JMP CNTARGS ;LOOP TILL DELIMITER FOUND
- NEXTARG:
- CALL SKIPSP ;SKIP SPACES AND TABS
- JNB SAVEARG ;IF NOT EOL, BACK TO TOP OF LOOP
- ENDLINE:
- CMP CX,0 ;CHECK ARGUMENT COUNT
- JG ARGSOK ;IF AT LEAST 1
- NOARGS:
- JMP USEMSG ;GIVE USE MESSAGE
- TOOMANY:
- ERROR 10 ;TOO MANY ARGUMENTS (PRETTY UNLIKELY)
- JMP EXIT2
- ARGSOK: MOV WORD PTR DS:NUMARGS,CX ;SAVE NUMBER OF ARGUMENTS
-
- ;*****************************************
- ;* LOOP, DELETING FILES IN ARGUMENT LIST *
- ;*****************************************
- MOV SI,OFFSET DS:ARGPTRS ;POINT TO POINTER TABLE
- RM1ARG:
- MOV BX,DS:[SI] ;GET POINTER TO ARG
- PUSH SI
- PUSH CX
- CALL RMARG ;DELETE IT
- POP CX
- POP SI
- ADD SI,2 ;ADVANCE TO NEXT ARG POINTER
- LOOP RM1ARG ;LOOP TILL NO MORE ARGS TO DELETE
- JMP EXIT2
-
- ;*******************
- ;* REMOVE ONE FILE *
- ;*******************
- RMARG PROC NEAR
- MOV BYTE PTR DS:DRIVE,0 ;SET DRIVE DEFAULT
- MOV DI,OFFSET RSTACK+ARG ;COLLECT FILE NAME
- MOV AL,[BX+1]
- CMP AL,':' ;CHECK FOR DRIVE SPEC
- JNE GETARG
- MOV AL,[BX] ;GET DRIVE LETTER
- SUB AL,'A'-1 ;MAKE BINARY
- MOV BYTE PTR DS:DRIVE,AL ;SAVE DRIVE
- GETARG: MOV AL,[BX] ;COPY FROM [BX] TO [DI] UNTIL DELIMITER
- COMPLIST <0,SPACE,TAB>,ENDARG
- STOSB
- INC BX
- JMP GETARG
- ENDARG: MOV AL,0
- STOSB ;END ARG W. ZERO
- MOV WORD PTR DS:RBASE,RSTACK ;SAVE OFFSET TO RSTACK
- CALL RMIT ;DO IT TO IT
- RET
- RMARG ENDP
-
- PAGE +
- ;*********************************************************************
- ; THIS ROUTINE REMOVES A FILE OR DIRECTORY WHOSE PATHNAME IS SPECIFIED
- ; IN FIELD 'ARG' OF A STRUCTURE OF TYPE 'RMSTRUC'. 'RBASE' POINTS
- ; TO THE START OF THE DATA STRUCTURE FOR THIS RECURSION LEVEL.
- ;
- RMIT PROC NEAR
- MOV BX,WORD PTR DS:RBASE ;GET BASE ADDR. (POINTER TO RMINFO)
- ADDR DX,DTA
- MOV AH,SET_DTA
- INT DOS ;SET DTA
- ADDR CX,SPATH
- ADDR DX,SPREFIX
- PUSH BX
- ADD BX,OFFSET ARG
- CALL FIXPATH ;PARSE PATHNAME
- POP BX
- CMP AX,TYPE_UNK
- JNE GOODPATH ;IF APPARENTLY OK
- ADDR DX,ARG
- CALL ERRORMSG
- ERROR 2 ;NONEXISTENT PATHNAME, COMPLAIN
- RET
- GOODPATH:
- MOV WORD PTR [BX].PATHTYPE,AX ;SAVE TYPE OF ARGUMENT
- IF GOOFPROOF
- CMP AX,TYPE_DRV ;DRIVE SPEC?
- JNE NOTDRV ;NO
- CMP BYTE PTR DS:IFLAG,TRUE ;I FLAG SET?
- JNE GETOK ;NO, GET OK
- JMP NOARGERR ;ELSE GO AHEAD
- ENDIF
- NOTDRV:
- CMP AX,TYPE_DIR ;DIRECTORY?
- JNE NOTDIR
- CMP BYTE PTR DS:RFLAG,TRUE ;R FLAG SET?
- JNE DIRERR ;NO, ERROR
- JMP NOARGERR ;YES, OK
- DIRERR:
- ADDR DX,ARG
- CALL ERRORMSG ;SHOW ARGUMENT
- ERROR 3 ;COMPLAIN THAT IT'S A DIRECTORY
- RET
- NOTDIR:
- IF GOOFPROOF
- CMP AX,TYPE_AFN
- JNE NOARGERR ;IF NOT AFN
- CMP BYTE PTR DS:LEVEL,0
- JG NOARGERR ;IF LEVEL>0, DON'T CHECK FOR *.*
- CMP BYTE PTR DS:IFLAG,TRUE
- JE NOARGERR ;DITTO IF I SWITCH SPECIFIED
- CALL CHECKWILD ;CHECK FOR *.*
- JNC NOARGERR ;IF SOMETHING ELSE
- GETOK:
- ADDR DX,SPATH
- CALL ERRORMSG ;SHOW SEARCH PATH
- ERROR 13
- ERROR 6A ;USER TYPED *.*, ASK FOR CONFIRMATION
- CALL GETYORN
- CMP AL,'Y'
- JE NOARGERR ;GO AHEAD IF 'Y' TYPED
- JMP EXIT2
- ENDIF
- ;******************************************
- ; SEE IF ANYTHING MATCHES THE SEARCH SPEC *
- ;******************************************
- NOARGERR:
- ADDR DX,SPATH ;POINT TO SEARCH PATH
- MOV CX,31H ;SET SEARCH ATTRIBUTES
- MOV AH,FIND_FIRST
- INT DOS ;SEARCH FOR 1ST MATCH
- JNC GOTONE ;OK IF SOMETHING FOUND
- ADDR DX,ARG
- CALL ERRORMSG ;ELSE SHOW ARGUMENT
- ERROR 2 ;SAY IT DOESN'T EXIST
- RET
- ;**************
- ; TOP OF LOOP *
- ;**************
- GOTONE:
- CALL BUILD_NAME ;MAKE UNAMBIG. FILE NAME
- JNC NOSKIP
- JMP NEXTFILE ;IF "FILE" IS "." OR ".."
- NOSKIP:
- TEST [BX].DTA+21,BIT$DIR ;IS THIS A DIRECTORY?
- JNZ GOTADIR ;YES.
- JMP RMFILE ;NO, IT'S A FILE
- ;*************************************************************
- ; IF ARG IS A DIRECTORY, AND R FLAG SET, DELETE ITS CONTENTS *
- ;*************************************************************
- GOTADIR:
- CMP BYTE PTR DS:RFLAG,TRUE ;R FLAG SET?
- JE RSET ;YES, OK TO DELETE DIRECTORY
- JMP NEXTFILE ;NO, JUST SKIP OVER DIRECTORY
- RSET:
- CMP BYTE PTR DS:IFLAG,TRUE ;I FLAG SET?
- JNE INOTSET ;NO, GO INTO DIRECTORY
- ADDR DX,FULLNAME
- CALL ERRORMSG ;SHOW DIRECTORY NAME
- ERROR 11 ;ASK IF USER WANTS TO ENTER IT
- CALL GETYORN ;GET RESPONSE
- CMP AL,'N'
- JE NEXTFILE ;IF N TYPED
- INOTSET:
- CMP WORD PTR DS:LEVEL,MAXLEVEL-1 ;ARE WE AT MAX LEVEL?
- JL NOTMAX ;NO
- ERROR 7 ;YES, TOO DEEP
- JMP EXIT2
- NOTMAX:
- COPYPATH FULLNAME,(ARG+RMSTRUCSIZE) ;COPY DIRECTORY TO ARG AT NEXT LEVEL
- PUSH BX ;SAVE POINTER TO BASE
- INC WORD PTR DS:LEVEL ;INCREMENT RECURSION LEVEL
- ADD WORD PTR DS:RBASE,RMSTRUCSIZE ;ADVANCE BASE POINTER
- CALL RMIT ;REMOVE THE DIRECTORY CONTENTS
- POP BX ;RESTORE BASE POINTER
- DEC WORD PTR DS:LEVEL ;DECREMENT RECURSION LEVEL
- SUB WORD PTR DS:RBASE,RMSTRUCSIZE ;RESTORE BASE TO PREVIOUS LEVEL
- ADDR DX,DTA
- MOV AH,SET_DTA
- INT DOS ;RESET DTA
- JMP SHORT NEXTFILE ;DO NEXT FILE
- ;**************************
- ; FOUND A FILE, REMOVE IT *
- ;**************************
- RMFILE:
- CMP BYTE PTR DS:VFLAG,TRUE ;CHECK VERBOSE FLAG
- JNE QUIET ;IF QUIET MODE
- ADDR DX,FULLNAME ;NOT QUIET, SHOW VERBIAGE
- CALL ERRORMSG
- CALL CRLF
- QUIET:
- CALL RM_FILE
- JNC NEXTFILE
- ADDR DX,FULLNAME ;IF ERROR, SHOW NAME
- ERROR 5 ;AND ERROR MSG.
- ;*****************
- ; BOTTOM OF LOOP *
- ;*****************
- NEXTFILE:
- MOV AH,FIND_NEXT
- INT DOS ;FIND NEXT MATCH, IF ANY
- JC NOMORE ;IF NONE
- JMP GOTONE ;GOT ONE, BACK TO TOP OF LOOP
- ;*************************************************
- ; NO MORE FILES, DELETE DIRECTORY (IF NECESSARY) *
- ; ************************************************
- NOMORE:
- CMP WORD PTR [BX].PATHTYPE,TYPE_DIR ;WAS THIS ARG A DIRECTORY?
- JNE DONE ;NO, DONE
- CMP BYTE PTR DS:RFLAG,TRUE ;RFLAG SET?
- JNE DONE ;NO, DONE
- ADDR DX,ARG ;POINT TO DIRECTORY NAME
- CMP BYTE PTR DS:IFLAG,TRUE ;I FLAG SET?
- JNE NOI
- CALL ERRORMSG ;DISPLAY DIRECTORY NAME
- ERROR 12 ;ASK FOR OK TO DELETE
- CALL GETYORN ;GET Y OR N RESPONSE
- CMP AL,'N'
- JE DONE ;IF N, DON'T DELETE IT
- NOI:
- ADDR DX,ARG
- MOV AH,RMDIR
- INT DOS ;REMOVE DIRECTORY (IT SHOULD BE EMPTY NOW)
- JNC DONE ;IF OK
- ADDR DX,ARG
- CALL ERRORMSG ;ELSE SHOW DIRECTORY NAME
- ERROR 5 ;AND ERROR MSG.
- DONE:
- RET ;ALL DONE
- RMIT ENDP
-
- ;**************************************************
- ; CHECKWILD = CHECK ARG FOR *.* ERASURE
- ; RETURNS 'C' = 1 IF *.* ON WHOLE DIRECTORY OR DRIVE
-
- CHECKWILD PROC NEAR
- ADDR SI,ARG ;GET ARG
- MOV CX,0
- FINDEND: ;FIND ITS END
- CMP BYTE PTR [SI],0
- JE GOTEND
- INC SI
- INC CX
- JMP SHORT FINDEND
- GOTEND:
- CMP CX,3
- JL NOTWIPE ;IF <3 CHARS.
- ADD SI,-3 ;LOOK AT LAST PART OF ARGUMENT
- CMP CX,3
- JE CHECKIT2 ;IF =3 CHARS.
- DEC SI
- CMP BYTE PTR [SI],'\' ;IF PREV. CHAR =
- JE CHECKIT ;DIR SPEC
- CMP BYTE PTR [SI],':'
- JE CHECKIT ;OR COLON, CHECK FOLLOWING STRING
- CLC ;OTHERWISE, ALLOW IT (SO TEST*.* IS
- RET ;NOT AN ERROR)
- CHECKIT:
- INC SI
- CHECKIT2:
- PUSH ES
- CLD
- MOV AX,DATA
- MOV ES,AX
- MOV DI,OFFSET ES:WILD ;SEE IF WILD CARD *.*
- CMPMORE:
- MOV AL,BYTE PTR ES:[DI]
- CMP AL,0
- JE ENDCMP
- CMPSB
- JE CMPMORE
- POP ES ;BUG FIX! v. 1.3
- JMP SHORT NOTWIPE ;IF NOT =
- ENDCMP:
- POP ES
- MOV AL,BYTE PTR DS:[SI]
- CMP AL,0
- JNE NOTWIPE ;IF NOT =
- STC ;WIPEOUT CITY
- RET
- NOTWIPE:
- CLC
- RET
-
- CHECKWILD ENDP
-
- PAGE +
- ;*****************************************************************************
- ; THIS ROUTINE TAKES THE INFO ON A FILE IN THE DTA AND USES IT TO GENERATE A
- ; FULL, UNAMBIGUOUS FILE NAME BY ADDING THE NECESSARY DIRECTORY PREFIXES TO IT.
- ; IT SETS THE CARRY FLAG IF THE "FILE" IS "." OR "..".
- ;
- BUILD_NAME PROC NEAR
- COPYPATH SPREFIX,FULLNAME ;GET SOURCE PREFIX, COPY TO FULL NAME
- DEC DI ;BACK UP OVER NULL
- ADDR SI,(DTA+30) ;POINT TO FILE NAME WE FOUND
- CMP [SI],BYTE PTR '.' ;DOES IT START WITH .? -
- JNE NOTDOT ;- NO
- STC ;- YES, SET CARRY TO SKIP IT
- RET
- NOTDOT:
- CALL CPYCNT ;ADD IT TO SOURCE PREFIX
- CLC ;CLEAR CARRY
- RET
- BUILD_NAME ENDP
-
- ;*************************************************************************
- ; REMOVE ONE FILE (NAME IS IN FIELD 'FULLNAME' OF THE 'RMSTRUC' POINTED TO
- ; BY BX). RETURNS WITH CARRY SET IF ERROR.
- ;
- RM_FILE PROC NEAR
- CMP BYTE PTR DS:IFLAG,TRUE ;IS FLAG SET TO CONFIRM?
- JNE COK ;NO.
- ADDR DX,FULLNAME
- CALL ERRORMSG ;SHOW FILE
- ERROR 4 ;ASK FOR CONFIRMATION
- CALL GETYORN ;GET Y OR N RESPONSE
- CMP AL,'Y' ;IS IT YES?
- JNE OKEXIT ;NO, RETURN W/O ERROR
- COK:
- TRYAGAIN:
- ADDR DX,FULLNAME
- MOV AH,UNLINK
- INT DOS ;UNLINK THAT SUCKER
- JNC OKEXIT ;IF NO PROBLEM
- CMP AX,5 ;WAS FILE R/O? (THIS OUGHT TO BE
- ; THE ONLY POSSIBLE ERROR)
- JNE ABEXIT ;EXIT IF SOME OTHER ERROR
- CMP BYTE PTR DS:FFLAG,TRUE ;CHECK F FLAG
- JE NOWARN ;IF SET, DON'T WARN ABOUT R/O FILE
- ADDR DX,FULLNAME
- CALL ERRORMSG ;SHOW FILE NAME
- ERROR 6 ;R/O FILE, QUERY USER AGAIN
- CALL GETYORN ;GET Y OR N RESPONSE
- CMP AL,'Y' ;TEST FOR 'Y' RESPONSE
- JNE OKEXIT ;QUIT (WITH NO ERROR) IF USER SAYS 'N'
- NOWARN:
- MOV CX,0 ;'Y' TYPED CLEAR ALL ATTRIBUTES
- ADDR DX,FULLNAME ;POINT TO FILE NAME
- MOV AH,CHMOD
- MOV AL,1 ;CHANGE ATTRIBUTES
- INT DOS ;TRY MAKING IT R/W
- JMP TRYAGAIN ;TRY TO ERASE IT AGAIN
- ABEXIT: STC
- RET
- OKEXIT: CLC
- RET
- RM_FILE ENDP
-
- EXIT2:
- MOV AH,EXIT
- INT DOS ;EXIT TO DOS
-
- CODE ENDS
- END ENTRY
-